import pandas as pd     #导入pandas库
#导入pyecharts库中的options模块
from pyecharts import options as opts
#导入pyecharts库中的TreeMap类
from pyecharts.charts import TreeMap
#导入pyecharts库中的globals模块的ThemeType全局变量
from pyecharts.globals import ThemeType
df=pd.read_excel('某店铺促销方式分析.xlsx')  #读取数据
total=df['购买人数'].sum()  #计算总购买人数
tree=[]                    #定义列表
#生成具有层级结构的字典列表，每个父节点有两个子节点
for i in range(len(df.index)):
    dic={}                  #定义字典
    #获取促销方式，并将其赋给父节点的name关键字
    dic['name']=df['促销方式'][i]
    #计算当前促销方式下的购买人数占比，并赋给父节点的value关键字
    dic['value']=round(int(df['购买人数'][i])/total*100,2)
    dic['children']=[
        {
            #将当前促销方式和性别组合并赋给子节点的name关键字
            'name':df['促销方式'][i]+'-男',
            #计算当前促销方式下的男性购买人数占比，并赋给子节点的value关键字
            'value':round(int(df['男'][i])/total*100,2)
        },
        {
            #将当前促销方式和性别组合并赋给子节点的name关键字
            'name':df['促销方式'][i]+'-女',
            #计算当前促销方式下的女性购买人数占比，并赋给子节点的value关键字
            'value':round(int(df['女'][i])/total*100,2)
        }
    ]
    tree.append(dic)        #将字典添加到列表中
#创建TreeMap类对象，并设置初始配置项，包括画布大小，图表主题和网页标题
treemap=TreeMap(init_opts=opts.InitOpts(
    width='1000px',height='600px',
    theme=ThemeType.SHINE,page_title='矩形树图'))
#添加数据，并设置标签的显示格式，不显示父节点标签，层级配置
treemap.add(series_name='',data=tree,
            label_opts=opts.LabelOpts(formatter='{b}\n\n{c}%'),
            upper_label_opts=opts.LabelOpts(is_show=False),
            levels=[
                opts.TreeMapLevelsOpts(
                    treemap_itemstyle_opts=opts.TreeMapItemStyleOpts(
                        gap_width=2)),
                opts.TreeMapLevelsOpts(
                    treemap_itemstyle_opts=opts.TreeMapItemStyleOpts(
                        gap_width=1))
                ]
            )
#设置全局配置项
treemap.set_global_opts(
    #设置标题配置项，包括图表标题及其位置
    title_opts=opts.TitleOpts(
        title='某店铺不同促销方式下男性和女性购买人数占比矩形树图',
        pos_left='center'),
    #设置图例配置项，不显示图例
    legend_opts=opts.LegendOpts(is_show=False)
)
treemap.render('例6-3.html')     #渲染图表